package com.jk.service;

import com.jk.Send;
import com.jk.dao.WalletMapper;
import com.jk.pojo.PayBank;
import com.jk.pojo.PayLog;
import com.jk.pojo.PayUser;
import com.jk.service.util.Constant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 钱包Service实现类
 * 李亚峰
 */

@Transactional
@Service("walletServiceImpl")
public class WalletServiceImpl implements WalletService{

    @Autowired
    private WalletMapper walletMapper;

    @Autowired
    private Send send;

    /**
     * 查询用户余额根据账号
     */
    public PayUser queryUserBalance(String useraccount) {

        return walletMapper.queryUserBalance(useraccount);
    }

    /**
     * 查询账号银行卡余额是否充足
     * 李亚峰
     */
    public PayBank queryBankMoney(String bankNum) {

        return walletMapper.queryBankMoney(bankNum);
    }

    /**
     *查询银行卡密码是否输入正确
     */
    public int QueruBankPwd(String bankNum, String bankPwd) {
        /**判断银行卡密码是否输入错误*/
        PayBank payBank=walletMapper.QueruBankPwd(bankNum,bankPwd);
        /**定义一个全局变量*/
        int flag=Constant.USEE_INITIAL;
        /**判断查询出来的对象ID是否为空  如果不为空则返回1  如果为空则返回0 */
        if(payBank!=null && !"".equals(payBank)){
            if(payBank.getBankid()!=null && !"".equals(payBank.getBankid())){
                flag=Constant.VERIFICATION_NONULL;
            }else{
                flag=Constant.VERIFICATION_NULL;
            }
        }
        return flag;
    }

    /**
     *查询支付宝账号密码是否输入错误
     */
    public int QueruUserPaymentPwd(String useraccount, String paymentPwd) {
        /**判断支付宝账号是否输入错误*/
        PayUser user = walletMapper.QueruUserPaymentPwd(useraccount,paymentPwd);
        /**定义一个全局变量 用来判断用户密码是否与账号匹配*/
        int flag = Constant.USEE_INITIAL;
        /**判断用户是否为空  如果为空则返回0 如果不为空则返回1 */
        if(user!=null && !"".equals(user)){
            if(user.getUserid()!=null && !"".equals(user.getUserid())){
                flag =Constant.VERIFICATION_NONULL;
            }else{
                flag=Constant.VERIFICATION_NULL;
            }
        }
        return flag;
    }

    /**
     * 充值 根据用户填写的金额 来修改用户的余额 以及银行余额
     * 李亚峰
     */
    // 使用value具体指定使用哪个事务管理器

    public int rechargeToUserBalanc(Double money,String bankNum ,String useraccount) {
        /**定义一个全局变量  用来存放银行余额修改是否成功的数据*/
        int b = Constant.USEE_INITIAL;
        /**修改账户余额 如果修改成功则返回修改成功几条数据*/
        int a =walletMapper.rechargeToUserBalanc(money,useraccount);
        /**判断是否修改成功 修改成功则进行修改银行账户余额*/
        if(a>Constant.USEE_INITIAL){
            b = walletMapper.rechargeToBankMoney(money,bankNum,useraccount);
        }
        /**用于记录交易日志*/
        PayLog log = new PayLog();
        /**赋值交易记录ID*/
        log.setLogId(UUID.randomUUID().toString().replaceAll("-",""));
        /**日志类型  “1”  为充值到余额*/
        log.setLogType(Constant.LOGTYPE_RECHANGE);
        /**日志内容*/
        log.setLogInfo("银行账号"+bankNum+"充值到账户余额"+money+"元");
        /**存储时间*/
        log.setSaveTime(new Date());
        /**交易金额*/
        log.setDealAmont(money);
        /**是否成功 1 成功  2 失败 */
        if(b>Constant.USEE_INITIAL){
            log.setLogSuccess(Constant.LOG_SUCCESS);
        }else{
            log.setLogSuccess(Constant.LOG_DEFEATED);
        }
        /**流水单号*/
        log.setRunNumber("ZFB-"+new Date().getTime()+(int)(Math.random()*10000000));
        /**根据用户账号查询用户ID*/
        PayUser user = walletMapper.queryUserBalance(useraccount);
        /**操作人ID*/
        log.setOperatorId(user.getUseraccount());
        /**用户ID*/
        log.setUserId(user.getUserid());
        /**是否回收 1 为不回收 2 为回收*/
        log.setLogStatus(Constant.LOG_STATUS_NONRECOVERY);
        /**对日志进行新增*/
        walletMapper.rechargeAddLog(log);

        return b;
    }

    /**
     * 提现功能   根据用户填写的金额   来修改用户的余额以及银行卡余额
     * 李亚峰
     */
    public int withdrawUserBalanc(Double money, String bankNum, String useraccount) {

            Map<Object,Object> map = new HashMap<Object, Object>();
            map.put("money",money);
            map.put("bankNum",bankNum);
            map.put("useraccount",useraccount);
            send.sendMsg(map);

            return 1;


    }

    /**
     *转账到别人支付宝功能流程
     * 李亚峰
     */
    public int transferToUserBalanc(Double Money, String UserNumber, String useraccount) {
        /**修改账户余额 如果修改成功则返回修改成功几条数据*/
        int a =walletMapper.transferToUserBalanc(Money,UserNumber);
        /**定义一个全局变量  用来存放银行余额修改是否成功的数据*/
        int b = Constant.USEE_INITIAL;
        /** 判断是否修改成功 修改成功则进行修改银行账户余额*/
        if(a>Constant.USEE_INITIAL){
            b=walletMapper.transferToReduceUserBalanc(Money,useraccount);
        }

        /**用于记录交易日志*/
        PayLog log = new PayLog();
        /**赋值交易记录ID*/
        log.setLogId(UUID.randomUUID().toString().replaceAll("-",""));
        /**日志类型  “1”  为充值到余额  "2" 为提现到银行卡功能 "3" 为转账 功能*/
        log.setLogType(Constant.LOGTYPE_TRANSFER);
        /**日志内容*/
        log.setLogInfo("转账给支付宝账号"+UserNumber+"      "+Money+"元");
        /**存储时间*/
        log.setSaveTime(new Date());
        /**交易金额*/
        log.setDealAmont(Money);
        /**是否成功 1 成功  2 失败 */
        if(b>Constant.USEE_INITIAL){
            log.setLogSuccess(Constant.LOG_SUCCESS);
        }else{
            log.setLogSuccess(Constant.LOG_DEFEATED);
        }
        /**流水单号*/
        log.setRunNumber("ZFB-"+new Date().getTime()+(int)(Math.random()*10000000));
        /**根据用户账号查询用户ID*/
        PayUser user = walletMapper.queryUserBalance(useraccount);
        /**操作人ID*/
        log.setOperatorId(user.getUseraccount());
        /**用户ID*/
        log.setUserId(user.getUserid());
        /**是否回收 1 为不回收 2 为回收*/
        log.setLogStatus(Constant.LOG_STATUS_NONRECOVERY);
        /**对日志进行新增*/
        walletMapper.rechargeAddLog(log);

        return b;
    }

    /**
     * 转账到银行卡
     */
    public int transferToBankMoney(Double money, String bankNum, String useraccount) {
        /**修改银行账户余额 如果修改成功则返回修改成功几条数据*/
        int a =walletMapper.transferToBankManey(money,bankNum);
        /**定义一个全局变量  用来存放银行余额修改是否成功的数据*/
        int b = Constant.USEE_INITIAL;
        if(a>Constant.USEE_INITIAL){
            b = walletMapper.transferReduceToUserBalanc(money,useraccount);
        }

        /**用于记录交易日志*/
        PayLog log = new PayLog();
        /**赋值交易记录ID*/
        log.setLogId(UUID.randomUUID().toString().replaceAll("-",""));
        /**日志类型  “1”  为充值到余额  "2" 为提现到银行卡功能 "3" 为转账 功能*/
        log.setLogType(Constant.LOGTYPE_TRANSFER);
        /**日志内容*/
        log.setLogInfo("转账到银行卡账号"+bankNum+"      "+money+"元");
        /**存储时间*/
        log.setSaveTime(new Date());
        /**交易金额*/
        log.setDealAmont(money);
        /**是否成功 1 成功  2 失败 */
        if(b>Constant.USEE_INITIAL){
            log.setLogSuccess(Constant.LOG_SUCCESS);
        }else{
            log.setLogSuccess(Constant.LOG_DEFEATED);
        }
        /**流水单号*/
        log.setRunNumber("ZFB-"+new Date().getTime()+(int)(Math.random()*10000000));
        /**根据用户账号查询用户ID*/
        PayUser user = walletMapper.queryUserBalance(useraccount);
        /**操作人ID*/
        log.setOperatorId(user.getUseraccount());
        /**用户ID*/
        log.setUserId(user.getUserid());
        /**是否回收 1 为不回收 2 为回收*/
        log.setLogStatus(Constant.LOG_STATUS_NONRECOVERY);
        /**对日志进行新增*/
        walletMapper.rechargeAddLog(log);

        return b;
    }

    /**
     *查询银行卡号回显
     */
    public String selectBankNum(String userid) {
        String bankNum = walletMapper.selectBankNum(userid);
        return bankNum;
    }
}
